package org.dei.perla.sys.console.core;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;

import org.dei.perla.sys.console.messages.ConsoleMessage;


/**
 * Classe che contiene metodi statici per inviare e ricevere messaggi
 * e per la conversione dei payload.
 * @author Diego
 *
 */
public class ConsoleUtils {
	
	/**
	 * Converto uno set di byte nel corrispondendente oggetto
	 * @param bytes
	 * @return
	 */
	public static Object toObject(byte[] bytes){
		Object object = null;
		
		try{				
			object = new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
		}catch (java.io.IOException ioe) {
				ioe.getMessage();
		}catch (java.lang.ClassNotFoundException cnfe) {
				cnfe.getMessage();
		}
		
		return object;
	}
	
	/**
	 * Metodo interno per la conversione Object -> Byte
	 * @param object
	 * @return
	 */
	public static byte[] toBytes(Object object) {
		
		ByteArrayOutputStream tBaos = new ByteArrayOutputStream();
		
		try {
		 
			ObjectOutputStream oos = new ObjectOutputStream(tBaos);
		    oos.writeObject(object);
		    
		}catch (java.io.IOException ioe) {
			ioe.printStackTrace();
		}
		
		return tBaos.toByteArray();
	}
	
	public static boolean sendRequest(ConsoleMessage.PerLaRequest parRequest, Socket parSocket) {
		
		try { 
			System.out.println("Invio richiesta in corso....\n");
			
			parRequest.writeDelimitedTo(parSocket.getOutputStream());	
			
			
			
			System.out.println("Inviata richiesta!!!\n");
			
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public static boolean sendResponse(ConsoleMessage.PerLaResponse parResponse, Socket parSocket) {
		
		try { 			
			System.out.println("Invio risposta in corso....\n");
			
			parResponse.writeDelimitedTo(parSocket.getOutputStream());			
						
			System.out.println("Inviata richiesta!!!\n");
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public static ConsoleMessage.PerLaRequest receiveRequest(Socket parSocket) {
		try {
			System.out.println("Ricezione richiesta in corso....\n");
			
			return ConsoleMessage.PerLaRequest.parseDelimitedFrom(parSocket.getInputStream());						
			
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		return null;
	}
	
	public static ConsoleMessage.PerLaResponse receiveResponse(Socket parSocket) {
		
		try {
			System.out.println("Ricezione risposta in corso....\n");
						
			return ConsoleMessage.PerLaResponse.parseDelimitedFrom(parSocket.getInputStream());
						
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}
